package com.wenda.admin.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期工具类
 *
 * @author ycl
 */
public class DateUtil {
    public static final SimpleDateFormat FORMAT_DEFAULT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static final SimpleDateFormat FORMAT_DATE_ONLY = new SimpleDateFormat("yyyy-MM-dd");
    public static final SimpleDateFormat FORMAT_TIME_ONLY = new SimpleDateFormat("HH:mm:ss");
    public static final SimpleDateFormat FORMAT_WORD_DATE_ONLY = new SimpleDateFormat("yyyy年MM月dd日");
    public static final SimpleDateFormat FORMAT_MINUTE = new SimpleDateFormat("HH:mm");


    /** 线程安全的日期格式对象 */
    private static final ThreadLocal<DateFormat> YMD = new ThreadLocal<DateFormat>() {

        @Override
        protected DateFormat initialValue() {
            // 年月日
            return new SimpleDateFormat("yyyy-MM-dd");
        }

    };

    private static final ThreadLocal<DateFormat> TIME = new ThreadLocal<DateFormat>() {

        @Override
        protected DateFormat initialValue() {
            // 时分秒
            return new SimpleDateFormat("HH:mm:ss");
        }

    };

    /**
     * 格式化年月日
     *
     * @param date
     * @return yyyy-MM-dd格式的字符串
     */
    public static String formatYMD(Date date) {
        return YMD.get().format(date);
    }

    public static String formatTime(Date date) {
        return TIME.get().format(date);
    }

    public static Date parseYMD(String date) throws ParseException {
        return YMD.get().parse(date);
    }


    public synchronized static Date parse(String dateStr) throws ParseException {
        return FORMAT_DEFAULT.parse(dateStr);
    }

    public synchronized static Date parse(String dateStr, SimpleDateFormat format) throws ParseException {
        if (format == null) {
            format = FORMAT_DEFAULT;
        }
        return format.parse(dateStr);
    }

    public synchronized static String format(Date date) {
        if (date == null) {
            return null;
        }
        return FORMAT_DEFAULT.format(date);
    }


    public synchronized  static String format(Date date, SimpleDateFormat format) {
        if (date == null || format == null) {
            return null;
        }
        return format.format(date);
    }

    public synchronized static String format(Date date, String format) {
        if (date == null || format == null) {
            return null;
        }
        SimpleDateFormat f = new SimpleDateFormat(format);
        return f.format(date);
    }

    /**
     * 获取截止日期
     *
     * @param startTime
     * @param timeNum
     * @return
     */
    public static Date getAfterYear(Date startTime, Integer timeNum) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(startTime);
        calendar.add(Calendar.YEAR, timeNum);// 把日期往后增加几年.整数往后推,负数往前移动
        return calendar.getTime();
    }

    public static Date getVipEndDate(int days){
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_YEAR,days-1);
        return c.getTime();
    }

    public static Date getVipEndDate(Date startDate,int days){
        Calendar c = Calendar.getInstance();
        c.setTime(startDate);
        c.add(Calendar.DAY_OF_YEAR,days-1);
        return c.getTime();
    }

    /**
     * 获取之后的秒
     *
     * @param startTime
     * @param timeNum
     * @return
     */
    public static Date getNextSecond(Date startTime, Integer timeNum) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(startTime);
        calendar.add(Calendar.SECOND, timeNum);// 把日期往后增加1s.整数往后推,负数往前移动
        return calendar.getTime();
    }

    /**
     * 获取某个日起是星期几，返回 1 - 7 星期1就是1，星期天就是7
     *
     * @param date
     * @return
     */
    public static int getDayOfWeek(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        int d = calendar.get(Calendar.DAY_OF_WEEK);
        //星期六用7表示，老外的星期天用1表示，星期一用2表示
        if (d == 1) {
            return 7;
        } else {
            return d - 1;
        }
    }

    /**
     * date1 - date2 相差天数
     *
     * @param date1 null  表示当前时间
     * @param date2 null  表示当前时间
     * @return
     */
    public static int getDiffDay(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(date2);
        cal2.setTime(date1);

        //获取日期在一年(月、星期)中的第多少天
        int day1 = cal1.get(Calendar.DAY_OF_YEAR);//第335天
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);//第365天

        //获取当前日期所在的年份
        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);

        //同年
        if(year1 == year2) {
            return day2-day1;
        }else {
            //计算d2 - d1, 可能 d2比d1小
            int j = year2 > year1 ? 1:-1;
            //如果两个日期的是在同一年，则只需要计算两个日期在一年的天数差；
            //不在同一年，还要加上相差年数对应的天数，闰年有366天
            int timeDistance = 0 ;
            int d = Math.abs(year1 - year2);
            for(int i = 0 ; i < d ; i ++)
            {
                if(i%4==0 && i%100!=0 || i%400==0){
                    //闰年
                    timeDistance += j*366;
                }
                else {
                    //不是闰年
                    timeDistance += j*365;
                }
            }
            return timeDistance + (day2-day1);

        }
    }

    /**
     * 根据年月日时分秒创建一个时间
     * 年月日，时分秒只要一个为空，就用当前时间替代
     *
     * @param year
     * @param month
     * @param day
     * @param hour
     * @param minute
     * @param second
     * @return
     */
    public static Date createTime(Integer year, Integer month, Integer day, Integer hour, Integer minute, Integer second) {
        Calendar calendar = Calendar.getInstance();
        if (year != null) {
            calendar.set(Calendar.YEAR, year);
        }

        if (month != null) {
            //月份从0开始算的
            calendar.set(Calendar.MONTH, month + 1);
        }

        if (day != null) {
            calendar.set(Calendar.DAY_OF_MONTH, day);
        }

        if (hour != null) {
            calendar.set(Calendar.HOUR_OF_DAY, hour);
        }

        if (minute != null) {
            calendar.set(Calendar.MINUTE, minute);
        }

        if (second != null) {
            calendar.set(Calendar.SECOND, second);
        }
        return calendar.getTime();
    }

    /**
     * 获取当前时间戳，10位
     * @return
     */
    public static Long timestampTen() {
        long timeStampSec = System.currentTimeMillis()/1000;
        String timestamp = String.format("%010d", timeStampSec);
        return Long.valueOf(timestamp);
    }
}
